package walker

import (
	"os"
	"path"
	"sort"
	"strings"
)

// var video_suffix sort.StringSlice = []string{
// 	".dff", ".dsf", ".mp3", ".aac", ".wav", ".wma", ".cda", ".flac", ".m4a", ".mid", ".mka",
// 	".mp2", ".mpa", ".mpc", ".ape", ".ofr", ".ogg", ".ra", ".wv", ".tta", ".ac3", ".dts",
// 	".tak", ".webm", ".wmv", ".mpeg", ".mov", ".ram", ".swf", ".mp4", ".avi", ".rm", ".rmvb",
// 	".flv", ".mpg", ".mkv", ".m3u8", ".ts", ".3gp", ".asf",
// }

var (
	videoSuffixes sort.StringSlice = []string{
		"dff", "dsf", "mp3", "aac", "wav", "wma", "cda", "flac", "m4a", "mid", "mka",
		"mp2", "mpa", "mpc", "ape", "ofr", "ogg", "ra", "wv", "tta", "ac3", "dts",
		"tak", "webm", "wmv", "mpeg", "mov", "ram", "swf", "mp4", "avi", "rm", "rmvb",
		"flv", "mpg", "mkv", "m3u8", "ts", "3gp", "asf",
	}
	maxLenOfVideoSuffixes = -1
	minLenOfVideoSuffixes = 999
)

func InitData() {
	sort.Sort(videoSuffixes)
	for _, v := range videoSuffixes {
		if len(v) > maxLenOfVideoSuffixes {
			maxLenOfVideoSuffixes = len(v)
		}
		if len(v) < minLenOfVideoSuffixes {
			minLenOfVideoSuffixes = len(v)
		}
	}
}

func IsVideo(path string) bool {
	if len(path) <= maxLenOfVideoSuffixes {
		return false
	}

	// suffixes := strings.Split(suf, ".")
	// suf = suffixes[len(suffixes)-1] // target

	// _, found := sort.Find(len(videoSuffixes), func(i int) int {
	// 	return strings.Compare(suf, videoSuffixes[i])
	// })

	suf := ""
	for i := len(path) - maxLenOfVideoSuffixes - 1; i < len(path)-minLenOfVideoSuffixes; i++ {
		if path[i] == '.' {
			suf = path[i+1:] // target
		}
	}

	if len(suf) == 0 {
		return false
	}

	if findStringInSlice(suf, videoSuffixes) >= 0 {
		return true
	}

	return false
}

func IsExists(ps ...string) bool {
	if len(ps) == 0 {
		return false
	}

	p := path.Join(ps...)

	if _, err := os.Stat(p); err != nil {
		return false
	}
	return true
}

func IsFile(path string) bool {
	if info, err := os.Stat(path); err == nil {
		return info.Mode().IsRegular()
	}
	return false
}

func IsDir(path string) bool {
	if info, err := os.Stat(path); err == nil {
		return info.Mode().IsDir()
	}
	return false
}

func isDirAndCutSuffix(path string, suf string) (name string, yes bool) {
	// if IsDir(path) {
	path2 := strings.TrimRight(path, "/")
	return strings.CutSuffix(path2, suf)
	// }
	// return "", false
}

// for video url name 
//  这个有点多余了. 现在默认开启这个.
func CutNeedTitleSuffix(path string) (name string, yes bool) {
	return isDirAndCutSuffix(path, "..need_title")
}
func CutNeedTitleSuffix2(path string) (name string, yes bool) {
	// keep no filter
	return isDirAndCutSuffix(path, "..need_title2")
}

// func CutOFFSuffix(path string) (name string, yes bool) {
// 	return isDirAndCutSuffix(path, "..off")
// }

// func CutOthersSuffix(path string) (name string, yes bool) {
// 	return isDirAndCutSuffix(path, ".others")
// }

// func CutBiliSuffix(path string) (name string, yes bool) {
// 	return isDirAndCutSuffix(path, ".bili.others")
// }
